package FanXingT;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Ajie
 * @date 2022/2/24
 * @function 如何在List<String>中加入一个int类型数据
 * https://www.jianshu.com/p/3fde9cdfb432
 * 抛开实用性，我们只是简单的去探讨一下这个问题。
 * List<String>指定了添加到List的对象必须为String类型，
 * 范型约束的产生在编译阶段，
 * 那么我们是否能够绕过编译，
 * 在运行阶段添加一个int类型的数据呢，答案是肯定的。
 */
public class StrListAddInt {
    public static void main(String[] args) {
        List<String> mlist = new ArrayList<>();
        mlist.add("test");
        // 添加int类型数据报错
        // mList.add(20);


        Class<? extends List> clazz = mlist.getClass();
        try {
            Method add = clazz.getMethod("add", Object.class);
            //package java.util
            // boolean add(E e);
            //反射操作
            Object invoke = add.invoke(mlist, 20);

            // 输出结果[test, 20]
            System.out.println(mlist);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        Object[] objects = mlist.toArray();
        System.out.println("mlist.toArray():"+objects);
        for (int i = 0; i < objects.length; i++) {
            System.out.println("object: "+objects[i]);
        }

        for (int i = 0; i < mlist.size(); i++) {
            //java.lang.Integer cannot be cast to java.lang.String
            System.out.println(mlist.get(i));
        }
    }
}
